import { Context } from 'koa';
import uploadService from '../services/upload.service';

/**
 * 上传控制器
 * @description 处理文件上传相关接口
 */
class UploadController {
  /**
   * 上传图片
   * @param ctx Koa上下文
   */
  public async uploadImage(ctx: Context): Promise<void> {
    try {
      // 获取上传的文件
      const file = ctx.request.file;

      if (!file) {
        ctx.status = 400;
        ctx.body = {
          code: 400,
          message: '没有上传文件',
        };
        return;
      }

      // 处理上传的图片
      const result = await uploadService.processUploadedImage(file);

      if (result.success) {
        ctx.status = 200;
        ctx.body = {
          code: 200,
          message: '图片上传成功',
          data: {
            fileName: result.fileName,
            fileUrl: result.fileUrl,
            thumbnailUrl: result.thumbnailUrl,
            size: result.size,
            mimetype: result.mimetype,
          },
        };
      } else {
        ctx.status = 400;
        ctx.body = {
          code: 400,
          message: result.error || '图片上传失败',
        };
      }
    } catch (error) {
      ctx.status = 500;
      ctx.body = {
        code: 500,
        message: error instanceof Error ? error.message : '服务器内部错误',
      };
    }
  }

  /**
   * 上传文件
   * @param ctx Koa上下文
   */
  public async uploadFile(ctx: Context): Promise<void> {
    try {
      // 获取上传的文件
      const file = ctx.request.file;

      if (!file) {
        ctx.status = 400;
        ctx.body = {
          code: 400,
          message: '没有上传文件',
        };
        return;
      }

      // 处理上传的文件
      const result = await uploadService.processUploadedFile(file);

      if (result.success) {
        ctx.status = 200;
        ctx.body = {
          code: 200,
          message: '文件上传成功',
          data: {
            fileName: result.fileName,
            fileUrl: result.fileUrl,
            size: result.size,
            mimetype: result.mimetype,
          },
        };
      } else {
        ctx.status = 400;
        ctx.body = {
          code: 400,
          message: result.error || '文件上传失败',
        };
      }
    } catch (error) {
      ctx.status = 500;
      ctx.body = {
        code: 500,
        message: error instanceof Error ? error.message : '服务器内部错误',
      };
    }
  }

  /**
   * 删除文件
   * @param ctx Koa上下文
   */
  public async deleteFile(ctx: Context): Promise<void> {
    try {
      const { fileName, type } = ctx.request.body;

      if (!fileName) {
        ctx.status = 400;
        ctx.body = {
          code: 400,
          message: '文件名不能为空',
        };
        return;
      }

      // 是否为图片
      const isImage = type === 'image';

      // 删除文件
      const result = await uploadService.deleteFile(fileName, isImage);

      if (result) {
        ctx.status = 200;
        ctx.body = {
          code: 200,
          message: '文件删除成功',
        };
      } else {
        ctx.status = 400;
        ctx.body = {
          code: 400,
          message: '文件删除失败，可能文件不存在',
        };
      }
    } catch (error) {
      ctx.status = 500;
      ctx.body = {
        code: 500,
        message: error instanceof Error ? error.message : '服务器内部错误',
      };
    }
  }

  /**
   * 上传多个文件
   * @param ctx Koa上下文
   */
  public async uploadMultipleFiles(ctx: Context): Promise<void> {
    try {
      // 获取上传的多个文件
      const files = ctx.request.files;

      if (!files || files.length === 0) {
        ctx.status = 400;
        ctx.body = {
          code: 400,
          message: '没有上传文件',
        };
        return;
      }

      // 处理每个文件
      const results = [];
      const fileType = ctx.query.type as string || 'file';
      const isImage = fileType === 'image';

      for (const file of files) {
        // 根据文件类型处理
        const result = isImage
          ? await uploadService.processUploadedImage(file)
          : await uploadService.processUploadedFile(file);

        results.push(result);
      }

      // 检查是否所有文件都上传成功
      const allSuccess = results.every((result) => result.success);

      if (allSuccess) {
        ctx.status = 200;
        ctx.body = {
          code: 200,
          message: '所有文件上传成功',
          data: results.map((result) => ({
            fileName: result.fileName,
            fileUrl: result.fileUrl,
            thumbnailUrl: result.thumbnailUrl, // 仅图片有缩略图
            size: result.size,
            mimetype: result.mimetype,
          })),
        };
      } else {
        // 部分文件上传失败
        ctx.status = 207; // Multi-Status
        ctx.body = {
          code: 207,
          message: '部分文件上传成功，部分失败',
          data: results,
        };
      }
    } catch (error) {
      ctx.status = 500;
      ctx.body = {
        code: 500,
        message: error instanceof Error ? error.message : '服务器内部错误',
      };
    }
  }
}

export default new UploadController();
